Recordá abrir en una nueva pestaña

Visualización con Plotly

Vamos a dar un recorrido por algunas de las posibilidades de la librería de visualización Plotly. Recordamos que estos son algunos de los ejemplos, en la documentación puede encontrar mucho más! Si estan usando Jupyter Lab o Jupyter Notebooks para correr esta notebook, recomendamos antes, instalar Plotly con sus respectivas extensiones como indica aquí

Podemos hacer distintos tipos de gráficos, nosotros vamos a abordar los siguientes:

  • Objeto gráfico

  • Gráficos a partir de diccionarios

  • Plotly express

Datos

Vamos a usar un dataset de la Ciudad de Buenos Aires con información acerca de estaciones de subtes.

import pandas as pd 
                                
data = pd.read_csv('https://datasets-humai.s3.amazonaws.com/datasets/data_subtes.csv')
data.info()
data.isna().sum()
data.head()
Unnamed: 0 periodo fecha desde hasta linea molinete estacion pax_pagos pax_pases_pagos pax_franq total
0 8300 202001 2020-01-01 14:45:00 15:00:00 LineaE LineaE_Medalla_Turn01 Medalla Milagrosa 0.0 2.0 0.0 2.0
1 8297 202001 2020-01-01 12:15:00 12:30:00 LineaH LineaH_SantaFe_Norte_Turn04 Santa Fe 0.0 1.0 0.0 1.0
2 8298 202001 2020-01-01 12:15:00 12:30:00 LineaH LineaH_SantaFe_Sur_Turn01 Santa Fe 0.0 5.0 0.0 5.0
3 8299 202001 2020-01-01 12:15:00 12:30:00 LineaD LineaD_9Julio_S_Turn01 9 de julio 0.0 1.0 0.0 1.0
4 8300 202001 2020-01-01 12:15:00 12:30:00 LineaD LineaD_Aguero_Turn02 Agüero 0.0 18.0 0.0 18.0

Vemos que el dataset es muy grande, por lo que nos vamos a quedar con una muestra.

import random

random.seed(7)
df = data.sample(frac=0.25)
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 750020 entries, 308760 to 604143
Data columns (total 12 columns):
 #   Column           Non-Null Count   Dtype  
---  ------           --------------   -----  
 0   Unnamed: 0       750020 non-null  int64  
 1   periodo          750020 non-null  int64  
 2   fecha            750020 non-null  object 
 3   desde            750020 non-null  object 
 4   hasta            750020 non-null  object 
 5   linea            750020 non-null  object 
 6   molinete         750020 non-null  object 
 7   estacion         750020 non-null  object 
 8   pax_pagos        750020 non-null  float64
 9   pax_pases_pagos  750020 non-null  float64
 10  pax_franq        750020 non-null  float64
 11  total            750020 non-null  float64
dtypes: float64(4), int64(2), object(6)
memory usage: 74.4+ MB

Ahora sí, vemos que tenemos un dataset sin valores nulos y bien organizado, podemos seguir con los gráficos.

A partir de un diccionario

import plotly.io as pio

fig = dict({
    "data": [{"type": "bar",
              "x": df['linea'].value_counts().index.tolist(),
              "y": df['linea'].value_counts()
              }],
    "layout": {"title": {"text": "Cantidad de observaciones por linea"}}
})

pio.show(fig)
/Users/mac/anaconda3/lib/python3.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning:

urllib3 (1.25.10) or chardet (3.0.4) doesn't match a supported version!

Dentro del mismo diccionario podemos personalizar nuestro gráfico de manera más detallada. Vemos como agregarle anotaciones y elegimos un tema de diseño.

fig = dict({
    "data": [{"type": "bar",
              "x": df['linea'].value_counts().index.tolist(),
              "y": df['linea'].value_counts()
              }],
    "layout": {"title": {"text": "Cantidad de observaciones por linea"},
               "template":"ggplot2",
               'annotations':[dict(text="Es la más concurrida", x=0, y=180000),
                             dict(text="Es la menos concurrida", x=5, y=80000)],
               'xaxis':{'title':'Lineas','color':'grey'},
               'yaxis':{'title':'Frecuencia','color':'grey'}
              }
})

pio.show(fig)

Plotly Express

Con plotly express podemos gozar de la calidad gráfica de plotly sin la necesidad de un código muy complejo.

Acomodomamos los formatos de las fechas.

df['desde'] = pd.to_datetime(df['desde'], format = '%H:%M:%S')
df['hasta'] = pd.to_datetime(df['hasta'], format = '%H:%M:%S')
df.hasta = df.hasta.apply(lambda x: x.strftime('%H:%M:%S'))
df.desde = df.desde.apply(lambda x: x.strftime('%H:%M:%S'))
df.fecha = pd.to_datetime(df['fecha'])
df['dia_semana'] = df['fecha'].apply(lambda x: x.day_name())
import plotly.express as px

template = 'ggplot2'

fig = px.histogram(df.sort_values(by='desde'),
                 x='desde', y="total",
                 template=template, title='Total de pasajeros por hora',
                  labels={'desde':'Horario','total':'Cantidad de pasajeros'})

fig.update_xaxes(rangeslider_visible=True)
fig.show()

Objeto Grafico

Esta clase de plotly nos permite una mayor customización de los graficos.

import plotly.graph_objects as go

Ahora vemos los histogramas de 3 días distintos para ver como se comportan, suponemos que los días laborales, el subte se usa más.

Lunes

x1 = df.loc[df['dia_semana']=='Monday']['desde']

traza1 = go.Histogram(
    x = x1.sort_values(),
    y = df.loc[df['dia_semana']=='Monday']['total'],
    name = 'Lunes',
    opacity = 0.8,
    xaxis = 'x1',
    yaxis = 'y1',
    marker = go.histogram.Marker(
        color = 'rgb(95, 182, 239)',
    )
)

Viernes

x2 = df.loc[df['dia_semana']=='Friday']['desde']

traza2 = go.Histogram(
    x = x2.sort_values(),
    y = df.loc[df['dia_semana']=='Friday']['total'],
    name = 'Viernes',
    opacity = 0.8,
    xaxis = 'x1',
    yaxis = 'y1',
    marker = go.histogram.Marker(
        color = 'rgb(300, 150, 100)',
    )
)

Sabados

x3 = df.loc[df['dia_semana']=='Saturday']['desde']

traza3 = go.Histogram(
    x = x3.sort_values(),
    y = df.loc[df['dia_semana']=='Saturday']['total'],
    name = 'Sabados',
    opacity = 0.8,
    xaxis = 'x1',
    yaxis = 'y1',
    marker = go.histogram.Marker(
        color = 'rgb(200, 104, 50)',
    )
)

Retocamos la estetica del gráfico.

plantilla = go.Layout(title='Histogramas por día de semana')

Ahora unimos todas las trazas en una figura de Graphing Objects

fig = go.Figure(data=[traza1, traza2, traza3], layout=plantilla)

fig.show()

Torta 2D

Creamos un objeto gráfico a partir de los datos instanciados en una figura de plotly express.

store = px.sunburst(df,path=['linea', 'estacion'])

traza = go.Sunburst(labels=store['data'][0]['labels'].tolist(),
                            parents=store['data'][0]['parents'].tolist())

fig = go.Figure(data=[traza])

fig.show()

Series de tiempo

Utilizaremos las series financieras de Apple, Google y Amazon.

df = pd.read_csv('https://datasets-humai.s3.amazonaws.com/datasets/data_financiera.csv')

Gráficamos las tres series de tiempo con las siguientes líneas de código.

columnas = ['AAPL','AMZN', 'GOOGL']

fig = go.Figure([{
    'x': df.Date,
    'y': df[col],
    'name': col
}  for col in columnas])

fig.update_xaxes(rangeslider_visible=True)
fig.update_layout(title='Amazon vs Google vs Apple')
fig.show()

OHLC

Vamos a utilizar una serie financiera, en especifico la de Apple.

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')
df.head(5)
Date AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted dn mavg up direction
0 2015-02-17 127.489998 128.880005 126.919998 127.830002 63152400 122.905254 106.741052 117.927667 129.114281 Increasing
1 2015-02-18 127.629997 128.779999 127.449997 128.720001 44891700 123.760965 107.842423 118.940333 130.038244 Increasing
2 2015-02-19 128.479996 129.029999 128.330002 128.449997 37362400 123.501363 108.894245 119.889167 130.884089 Decreasing
3 2015-02-20 128.619995 129.500000 128.050003 129.500000 48948400 124.510914 109.785449 120.763500 131.741551 Increasing
4 2015-02-23 130.020004 133.000000 129.660004 133.000000 70974100 127.876074 110.372516 121.720167 133.067817 Increasing

Por sus siglas en inglés OHLC es Open High Low Close.

fig = go.Figure(data=go.Ohlc(x=df['Date'],
                open=df['AAPL.Open'],
                high=df['AAPL.High'],
                low=df['AAPL.Low'],
                close=df['AAPL.Close']))


fig.update_layout(
    title='OHLC de Apple',
    yaxis_title='AAPL',
    shapes = [dict(
        x0='2016-12-09', x1='2016-12-09', y0=0, y1=1, xref='x', yref='paper',   #con esta linea de codigo hacemos la linea vertical
        line_width=2)],
    annotations=[dict(
        x='2016-12-09', y=0.60, xref='x', yref='paper',
        showarrow=True, xanchor='right', text='Apple actualizó el software')]    #con esta linea nos encargamos de la anotación
)


fig.show()

Ejercicio

Continuando con el ejemplo anterior, realice el gráfico de la OHLC. Investigue la documentación para agregarle ulteriores modificaciones. Además considere agregarle al gráfico la media móvil (‘mavg’) y su volumén diario (‘AAPL.Volume’)

# Traza 1 
traza1 = go.Ohlc()

# Traza 2 
traza2 = go.Scatter()

# Traza 3 
traza3 = go.Histogram()
fig = go.Figure(data=[traza1,traza2,traza3])
fig.show()